package br.unesp.rc.locadora.utils;

import br.unesp.rc.locadora.dao.FisicaDAO;
import br.unesp.rc.locadora.dao.FisicaDAOImpl;
import java.lang.Exception;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ICUtil {
	private static final int DIGITOS_CPF = 11;
	private static final int DIGITOS_CNPJ = 14;
	
	public static boolean validaCPF(String CPF){
		try{
			if(CPF.length() == DIGITOS_CPF){
				int[] digitos = new int[DIGITOS_CPF];
				
				for(int i = 0; i < CPF.length(); i++){
					digitos[i] = Integer.parseInt(String.valueOf(CPF.charAt(i)));
				}
				
				int digito1;
				digito1 = 10 * digitos[0] + 9 * digitos[1] + 8 * digitos[2]
							+ 7 * digitos[3] + 6 * digitos[4] + 5 * digitos[5]
							+ 4 * digitos[6] + 3 * digitos[7] + 2 * digitos[8];
				digito1 = 11 - digito1 % 11;
				if(digito1 >= 10) digito1 = 0;
				
				int digito2;
				digito2 = /*11 * digitos[0] + */10 * digitos[1] + 9 * digitos[2] + 8 * digitos[3]
						+ 7 * digitos[4] + 6 * digitos[5] + 5 * digitos[6]
						+ 4 * digitos[7] + 3 * digitos[8] + 2 * digito1;
				digito2 = 11 - digito2 % 11;
				if(digito2 >= 10) digito2 = 0;
				
				if(digito1 == digitos[9] && digito2 == digitos[10])
					return true;
				
			}
		}catch(Exception e){
			
		}
		
		return false;
	}
	
	public static boolean validaCNPJ(String CNPJ){
		try{
			if(CNPJ.length() == DIGITOS_CNPJ){
				int[] digitos = new int[DIGITOS_CNPJ];
				
				for(int i = 0; i < CNPJ.length(); i++){
					digitos[i] = Integer.parseInt(String.valueOf(CNPJ.charAt(i)));
				}
				
				int digito1;
				digito1 = 5 * digitos[0] + 4 * digitos[1] + 3 * digitos[2]
							+ 2 * digitos[3] + 9 * digitos[4] + 8 * digitos[5]
							+ 7 * digitos[6] + 6 * digitos[7] + 5 * digitos[8]
							+ 4 * digitos[9] + 3 * digitos[10] + 2 * digitos[11];
				digito1 = 11 - digito1 % 11;
				if(digito1 >= 10) digito1 = 0;
				
				int digito2;
				digito2 = 6 * digitos[0] + 5 * digitos[1] + 4 * digitos[2]
						+ 3 * digitos[3] + 2 * digitos[4] + 9 * digitos[5]
						+ 8 * digitos[6] + 7 * digitos[7] + 6 * digitos[8]
						+ 5 * digitos[9] + 4 * digitos[10] + 3 * digitos[11]
						+ 2 * digito1;
				digito2 = 11 - digito2 % 11;
				if(digito2 >= 10) digito2 = 0;
				
				if(digito1 == digitos[12] && digito2 == digitos[13])
					return true;
			}
		}catch(Exception e){
			
		}
		
		return false;
	}
        
        public static boolean validaData(String data){
            Pattern pattern = Pattern.compile("\\d{2,2}/\\d{2,2}/\\d{4,4}");
            Matcher matcher = pattern.matcher(data);
            if(matcher.matches()){
                try{
                    String[] strData = data.split("/");
                    int dia = Integer.parseInt(strData[0]);
                    int mes = Integer.parseInt(strData[1]);
                    int ano = Integer.parseInt(strData[2]);

                    if(dia > 0 && mes > 0 && mes < 13){
                        switch(mes){
                            case 1:
                                if(dia <= 31) return true;
                                break;
                            case 2:
                                if(ano % 4 == 0){
                                    if(ano % 100 == 0){
                                        if(ano % 400 == 0){
                                            if(dia <= 29) return true;
                                        }else{
                                            if(dia <= 28) return true;
                                        }
                                    }else{
                                        if(dia <= 29) return true;
                                    }
                                }else{
                                    if(dia <= 28) return true;
                                }
                                break;   
                            case 3:
                                if(dia <= 31) return true;
                                break;
                            case 4:
                                if(dia <= 30) return true;
                                break; 
                            case 5:
                                if(dia <= 31) return true;
                                break;
                            case 6:
                                if(dia <= 30) return true;
                                break;   
                            case 7:
                                if(dia <= 31) return true;
                                break;
                            case 8:
                                if(dia <= 31) return true;
                                break; 
                            case 9:
                                if(dia <= 30) return true;
                                break;
                            case 10:
                                if(dia <= 31) return true;
                                break;   
                            case 11:
                                if(dia <= 30) return true;
                                break;
                            case 12:
                                if(dia <= 31) return true;
                                break;                         
                        }
                    }
                }catch(Exception e){

                }
            }            
            
            return false;
        }
        
        public static boolean validaEmail(String email){
            Pattern padrao = Pattern.compile(".+@.+\\.[a-z]+");   
  
            Matcher pesquisa = padrao.matcher(email);
            
            return pesquisa.matches();
        }
        
        public static boolean validaTelefone(String telefone){
            Pattern padrao = Pattern.compile("\\(\\d{3,3}\\) \\d{4,4}-\\d{4,4}");   
  
            Matcher pesquisa = padrao.matcher(telefone);
            
            return pesquisa.matches();
        }
        
        public static boolean validaCEP(String CEP){
            Pattern padrao = Pattern.compile("\\d{5,5}-\\d{3,3}");   
  
            Matcher pesquisa = padrao.matcher(CEP);
            
            return pesquisa.matches();
        }
        
        public static boolean validaUsuario(String usuario){
            FisicaDAO dao = new FisicaDAOImpl();
            List<String> usuarios = dao.getUsuarios();
            boolean notmatch = true;
            
            for(String user : usuarios){
                if(usuario.equals(user)){
                    notmatch = false;
                    break;
                }
            }
            
            return notmatch;
        }
        
        public static boolean validaNumero(String numero){
            try{
                Integer.parseInt(numero);
                return true;
            }catch(Exception e){
                
            }
            return false;
        }
}
